Skip to main content

一次 DNS 事故

2026.1.14

事故描述:

本地 flask 服务运行在 5000 端口,由 nginx 代理接受外部服务,因此 ufw 无需开启 5000 端口。

本地端口测试 200 无异常

curl -I http://127.0.0.1:5000/

同时 cloudflare 中已经开启 DNS,A记录 auth.oridinis.dev3.132.25.89

但是服务器端测试:

curl -I https://focus.ordinis.dev/

报错

curl: (6) Could not resolve host: focus.ordinis.dev

我们的解决流程如下:

很显然问题为:域名根本没解析(DNS 解析失败),所以浏览器/curl 都找不到 focus.ordinis.dev

报错原因显示的意思为 DNS 查询不到记录(或你本机 DNS 环境阻断了)。


验证 Nginx 是否在 443 起服务

sudo ss -lntp | grep -E ':80|:443'
LISTEN 0      4096       127.0.0.1:8081       0.0.0.0:*    users:(("docker-proxy",pid=150303,fd=7))                                                LISTEN 0      511          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=176268,fd=5),("nginx",pid=176267,fd=5),("nginx",pid=89866,fd=5))    LISTEN 0      511          0.0.0.0:443        0.0.0.0:*    users:(("nginx",pid=176268,fd=13),("nginx",pid=176267,fd=13),("nginx",pid=89866,fd=13))

Nginx 服务没有问题


在服务器上验证 DNS 是否解析

getent hosts focus.ordinis.dev

能输出 IP 才算解析成功。结果发现没有输出。那么说明要么是

  • Cloudflare 记录没加/没生效
  • 你服务器 DNS resolver 有问题(最常见:/etc/resolv.conf 指向了坏的 DNS,或 systemd-resolved 异常)
  • 你在服务器上用的是“只查本机 hosts/本地 DNS”的路径,没有真正去公网 DNS 查询(比如 NSS 配置不正常,但更少见)

第一种情况:Cloudflare 侧的问题

在你的 本地电脑(不是服务器)跑:

nslookup focus.ordinis.dev
Server: 66.253.214.16 Address: 66.253.214.16#53 Non-authoritative answer: Name: focus.ordinis.dev Address: 104.21.13.162 Name: focus.ordinis.dev Address: 172.67.156.201

能解析,说明 Cloudflare 没有问题。

第二种情况:DNS resolver 有问题

在服务器上快速定位 DNS 到底卡在哪

resolv.conf 指向谁

cat /etc/resolv.conf
nameserver 127.0.0.53 
options edns0 trust-ad
search us-east-2.compute.internal

理想情况(systemd-resolved)通常会看到类似:

  • nameserver 127.0.0.53
  • 或者直接是公网 DNS(1.1.1.1/8.8.8.8)

如果你看到的是奇怪内网 IP、空的、或根本不可达的地址,就是问题。

目前输出表示:所有 DNS 查询 → 交给 systemd-resolved 的本地 stub

⚠️ 这是没有问题的,但前提是:systemd-resolved 必须知道要把请求转发给谁


直接绕过系统 resolver,测试 DNS 本身是否可用

sudo apt update
sudo apt install -y dnsutils
dig @1.1.1.1 focus.ordinis.dev +short
dig @8.8.8.8 focus.ordinis.dev +short
172.67.156.201 
104.21.13.162
104.21.13.162
172.67.156.201

这两个 IP 是 Cloudflare Anycast IP, 所以不是 Cloudflare,不是 DNS 传播,不是网络的问题


由此可以判断,服务器“能访问公网 DNS(1.1.1.1 / 8.8.8.8)”,但“不能用本机 resolver 解析”

因此问题为 systemd-resolved :

  • 没有 uplink DNS
  • 或 uplink DNS 是某个 AWS 内网 DNS / 已失效地址
  • 或 DHCP 没正确下发 DNS

这是 Ubuntu + systemd-resolved 的经典坑

  • /etc/resolv.conf → 指向 127.0.0.53(stub)
  • 但:
    • netplan / DHCP 没有给 DNS
    • 或云厂商 metadata DNS 不可达
  • 于是:
    • stub 存在
    • 没有真正的递归 DNS

所以结果就是:

dig @1.1.1.1 可以

dig focus.ordinis.dev 不行

解决方案

Step 1:明确告诉 systemd-resolved 用哪些 DNS

sudo mkdir -p /etc/systemd/resolved.conf.d
sudo tee /etc/systemd/resolved.conf.d/dns.conf >/dev/null <<'EOF'
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
Domains=~.
EOF

解释:

  • DNS=:主 DNS
  • FallbackDNS=:兜底
  • Domains=~.所有域名都走这些 DNS(非常关键)

Step 2:重启 resolved

sudo systemctl restart systemd-resolved

Step 3:确认状态(这一步很重要)

resolvectl status

你应该看到类似:

Global
DNS Servers: 1.1.1.1 8.8.8.8
Fallback DNS Servers: 9.9.9.9

Step 4:立刻验证

getent hosts focus.ordinis.dev
curl -I https://focus.ordinis.dev/

这两条现在一定会成功